package com.seecen.HJM.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.seecen.HJM.constant.JwtClaimsConstant;
import com.seecen.HJM.constant.MessageConstant;
import com.seecen.HJM.mapper.FeedbackMapper;
import com.seecen.HJM.model.dto.FeedbackDTO;
import com.seecen.HJM.model.entity.Feedback;
import com.seecen.HJM.result.DataVo;
import com.seecen.HJM.result.PageResult;
import com.seecen.HJM.service.FeedbackService;
import com.seecen.HJM.util.ThreadLocalUtil;
import com.seecen.HJM.util.TypeConversionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
* @author 李龙
* @description 针对表【tb_feedback】的数据库操作Service实现
* @createDate 2025-09-28 14:32:20
 *
*/
@Service
public class FeedbackServiceImpl extends ServiceImpl<FeedbackMapper, Feedback>
    implements FeedbackService{
    @Autowired
    private FeedbackMapper mapper;

    //获取反馈列表
    @Override
    @Cacheable(value = "feedbackCache",key = "'getFeedbackList' + #feedbackDTO.pageNum + #feedbackDTO.pageSize + #feedbackDTO.keyword")
    public DataVo getFeedback(FeedbackDTO feedbackDTO) {
        //分页查询 条件：1.时间 2.关键字 模糊查询
        Integer num=feedbackDTO.getPageNum();
        Integer size= feedbackDTO.getPageSize();
        Page<Feedback> page = new Page<>(num,size);
        QueryWrapper<Feedback> queryWrapper = new QueryWrapper<>();
        //模糊查询
        if (feedbackDTO.getKeyword() != null) {
            queryWrapper.like("feedback", feedbackDTO.getKeyword());
        }
        //时间查询 倒序排序
        queryWrapper.orderByDesc("create_time");
        IPage<Feedback> feedbackPage = mapper.selectPage(page, queryWrapper);
        //判断成功失败
        if (feedbackPage.getRecords().size() == 0) {
            return DataVo.success(MessageConstant.DATA_NOT_FOUND, new PageResult<>(0L, null));
        }

        return DataVo.success(new PageResult<>(feedbackPage.getTotal(), feedbackPage.getRecords()));
    }

    //删除反馈
    @Override
    @CacheEvict(cacheNames = "feedbackCache", allEntries = true)
    public DataVo deleteFeedback(Long feedbackId) {
        if (mapper.deleteById(feedbackId) == 0) {
            return DataVo.error(MessageConstant.DELETE + MessageConstant.FAILED);
        }
        return DataVo.success(MessageConstant.DELETE + MessageConstant.SUCCESS);
    }

    //批量删除
    @Override
    @CacheEvict(cacheNames = "feedbackCache", allEntries = true)
    public DataVo deleteFeedbackList(List<Long> feedbackIds) {
        if (mapper.deleteByIds(feedbackIds) == 0) {
            return DataVo.error(MessageConstant.DELETE + MessageConstant.FAILED);
        }
        return DataVo.success(MessageConstant.DELETE + MessageConstant.SUCCESS);
    }

    //添加反馈
    /*
    反馈存在 id userid text time
    添加反馈 1.获取用户id
    2.获取反馈信息
    3.获取当前时间
    当用户使用时 获取当前用户线程本地变量对应的用户id
    通过前端获取反馈信息
    */
    @Override
    @CacheEvict(cacheNames = "feedbackCache", allEntries = false)
    public DataVo addFeedback(String content) {
        // 1. 从ThreadLocal获取用户信息，先判断map是否为null（避免空指针）
        Map<String, Object> map = ThreadLocalUtil.get();
        if (map == null) {
            // 用户未登录或ThreadLocal未初始化，返回错误提示
            return DataVo.error(MessageConstant.NOT_LOGIN);
            // 注意：需要在MessageConstant中添加"USER_NOT_LOGIN"对应的文案，如"用户未登录，请先登录"
        }

        // 2. 获取用户ID，判断是否存在（避免userIdObject为null）
        Object userIdObject = map.get(JwtClaimsConstant.USER_ID);
        if (userIdObject == null) {
            return DataVo.error(MessageConstant.FAILED); // 用户信息缺失
        }

        // 3. 类型转换（确保转换安全）
        Long userId = TypeConversionUtil.toLong(userIdObject);
        if (userId == null) { // 若转换失败（如userId不是数字格式）
            return DataVo.error(MessageConstant.FAILED);
        }

        // 4. 校验content参数（避免空内容提交）
        if (content == null || content.trim().isEmpty()) {
            return DataVo.error(MessageConstant.NOT_NULL); // 反馈内容不能为空
        }

        // 5. 构造Feedback对象，执行数据库插入（之前缺失的核心逻辑）
        Feedback feedback = new Feedback();
        feedback.setUserId(userId);
        feedback.setFeedback(content.trim()); // 去除前后空格
        feedback.setCreateTime(LocalDateTime.now());
        int insertCount = mapper.insert(feedback); // 插入数据库

        // 6. 判断插入结果，返回对应DataVo
        if (insertCount > 0) {
            return DataVo.success(MessageConstant.SUCCESS, feedback); // 添加成功
        } else {
            return DataVo.error(MessageConstant.FAILED); // 添加失败
        }
    }

    @Override
    public boolean removeByUserId(Long userId) {
        // 创建查询条件构造器
        LambdaQueryWrapper<Feedback> queryWrapper = new LambdaQueryWrapper<>();
        // 添加条件：user_id 等于传入的userId
        queryWrapper.eq(Feedback::getUserId, userId);

        // 执行删除操作
        int deleteCount = mapper.delete(queryWrapper);

        // 返回删除结果（删除数量大于0表示成功）
        return deleteCount > 0;
    }

}




